home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5e.s < prev    next >
Text File  |  1994-07-06  |  5KB  |  172 lines

  1.  
  2. ; Lezione5e.s    DIMEZZAMENTO DELL'ALTEZZA DI UNA FIGURA MODIFICANDO I MODULI
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO I NOSTRI BITPLANES
  16.  
  17.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  20. POINTBP:
  21.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  22.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  23.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  25.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  26.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  27.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  28. ;
  29.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  30.     move.w    d0,$dff088        ; Facciamo partire la COP
  31.  
  32.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  33.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  34.  
  35. mouse:
  36.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  37.     bne.s    mouse        ; Se non ancora, non andare avanti
  38. frame:
  39.     cmpi.b    #$fe,$dff006    ; Siamo alla linea 254? (deve rifare il giro!)
  40.     bne.s    frame        ; Se non ancora, non andare avanti
  41. frame2:
  42.     cmpi.b    #$fd,$dff006    ; Siamo alla linea 253?
  43.     bne.s    frame2        ; Se non ancora, non andare avanti
  44. frame3:
  45.     cmpi.b    #$fc,$dff006    ; Siamo alla linea 252?
  46.     bne.s    frame3
  47. frame4:
  48.     cmpi.b    #$fb,$dff006    ; Siamo alla linea 251?
  49.     bne.s    frame4
  50.  
  51.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  52.     beq.s    NonMuovere    ; la routine dello scroll, bloccandolo
  53.  
  54.     bsr.s    MuoviCopper    ; Routine dei moduli
  55.  
  56. NonMuovere
  57.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  58.     bne.s    mouse        ; se no, torna a mouse:
  59.  
  60.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  61.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  62.  
  63.     move.l    4.w,a6
  64.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  65.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  66.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  67.     rts            ; USCITA DAL PROGRAMMA
  68.  
  69. ;    Dati
  70.  
  71. GfxName:
  72.     dc.b    "graphics.library",0,0    
  73.  
  74. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  75.     dc.l    0    ; della graphics.library
  76.  
  77. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  78.     dc.l    0
  79.  
  80. ; Con questa routine aggiungiamo o sottraiamo 40 ai registri dei moduli per
  81. ; accorciare la figura. Ho mantenuto le label dell'esempio precedente per
  82. ; risparmiare tempo.
  83.  
  84. MuoviCopper:
  85.     TST.B    SuGiu        ; Dobbiamo salire o scendere?
  86.     beq.w    VAIGIU
  87.     tst.w    MOD1        ; Siamo al valore normale del modulo? (ZERO)
  88.     beq.s    MettiGiu    ; se si, dobbiamo aumentare il valore
  89.     sub.w    #40,MOD1    ; sottraiamo 40, ossia 1 linea, facendo
  90.                 ; scorrere in BASSO la figura (ingrandendola)
  91.     sub.w    #40,MOD2    ; sottraiamo 40 al modulo 2
  92.     rts
  93.  
  94. MettiGiu:
  95.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  96.     rts            ; fara' saltare alla routine VAIGIU
  97.  
  98. VAIGIU:
  99.     cmpi.w    #40*20,MOD1    ; abbiamo dimezzato abbastanza??
  100.     beq.s    MettiSu        ; se si, dobbiamo far tornare la pic normale
  101.     add.w    #40,MOD1    ; Aggiungiamo 40, ossia 1 linea, facendo
  102.                 ; scorrere in ALTO la figura (dimezzandola)
  103.     add.w    #40,MOD2    ; Aggiungiamo 40 al modulo 2
  104.     rts
  105.  
  106. MettiSu:
  107.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  108.     rts            ; significa che dobbiamo risalire.
  109.  
  110.  
  111. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG.
  112.  
  113. SuGiu:
  114.     dc.b    0,0
  115.  
  116.  
  117.     SECTION    GRAPHIC,DATA_C
  118.  
  119. COPPERLIST:
  120.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  121.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  122.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  123.     dc.w    $13e,$0000
  124.  
  125.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  126.     dc.w    $90,$2cc1    ; DiwStop
  127.     dc.w    $92,$0038    ; DdfStart
  128.     dc.w    $94,$00d0    ; DdfStop
  129.     dc.w    $102,0        ; BplCon1
  130.     dc.w    $104,0        ; BplCon2
  131.     dc.w    $108
  132. MOD1:
  133.     dc.w    0        ; Bpl1Mod
  134.     dc.w    $10a
  135. MOD2:
  136.     DC.W    0        ; Bpl2Mod
  137.  
  138.             ; 5432109876543210
  139.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  140.                     ; 3 bitplanes lowres, non lace
  141. BPLPOINTERS:
  142.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  143.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  144.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  145.  
  146.     dc.w    $0180,$000    ; color0
  147.     dc.w    $0182,$475    ; color1
  148.     dc.w    $0184,$fff    ; color2
  149.     dc.w    $0186,$ccc    ; color3
  150.     dc.w    $0188,$999    ; color4
  151.     dc.w    $018a,$232    ; color5
  152.     dc.w    $018c,$777    ; color6
  153.     dc.w    $018e,$444    ; color7
  154.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  155.  
  156. ;    figura
  157.  
  158.  
  159. PIC:
  160.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  161.                     ; convertita col KEFCON, fatta di
  162.                     ; 3 bitplanes consecutivi
  163.     end
  164.  
  165. Per fare una cosa piu' "pulita" avrei dovuto mettere un wait sotto la figura
  166. che mi togliesse di mezzo le "impurita" che si vedono in basso, ossia i byte
  167. in memoria dopo la figura e i bitplanes che "spuntano" sotto il primo e il
  168. secondo. Ma lo scopo principale e' quello di spiegare la funzione dei moduli.
  169. La routine tra l'altro viene eseguita una volta ogni 4 fotogrammi per
  170. rallentarla.
  171.  
  172.